package proxy;

import proxy.jdkproxy.StarInvocationHandler;
import proxy.target.HanHong;
import proxy.target.Star;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.lang.reflect.Proxy;

/**
 * jdk 动态代理测试类
 * @author wangxun
 * @version 1.0
 * @description: TODO
 * @date 2020/11/13 9:53 上午
 */
public class JdkProxyTest {
    // 1. 生成java源文件
    // 2. 编译源文件为class文件
    // 3. 类加载器加载到内存
    // 4. 利用反射 instance 代理对象

    public static void main(String[] args) {
        Star StarProxy =(Star) Proxy.newProxyInstance(JdkProxyTest.class.getClassLoader(), new Class[]{Star.class}, new StarInvocationHandler(new HanHong()));
        StarProxy.sign();
        StarProxy.sing();
        StarProxy.collect();
        generatorClass(StarProxy);
    }

    /**
     * 将代理对象输入到硬盘上
     * @param proxy 代理对象
     */
    private static void generatorClass(Object proxy) {
        FileOutputStream out = null;
        try {
            byte[] generateProxyClass = ProxyGenerator.generateProxyClass(proxy.getClass().getSimpleName(),
                    new Class[] { proxy.getClass() });
            out = new FileOutputStream(proxy.getClass().getSimpleName() + ".class");
            out.write(generateProxyClass);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                }
            }
        }

    }

}
